const obj = {
  a: 1,
  b: 2,
  c: 3,
  d: {
    a: 1,
    b: 2,
  },
};

function isObject(val) {
  return typeof val === "object" && val !== null;
}

function observe(obj) {
  for (let k in obj) {
    let v = obj[k];
    if (isObject(v)) {
      observe(v);
    }
    Object.defineProperty(obj, k, {
      get() {
        console.log("读取", k);
        return v;
      },
      set(val) {
        console.log("更新", k);
        v = val;
      },
    });
  }
}

// let v = obj.a;
// Object.defineProperty(obj, "a", {
//   get() {
//     console.log("读取", "a");
//     return v;
//   },
//   set(val) {
//     console.log("更新", "a");
//     v = val;
//   },
// });
observe(obj);

obj.a;
obj.a = 2;
obj.b = 1;
obj.d.a;
console.log(obj, "==");
/**
 * 通过Object.defineProperty方法监听对象的值可以监听到读取和变化 循环对象可以都加上监听
 */
